package com.errorfinding.rabbitmq.three;

import com.errorfinding.rabbitmq.util.RabbitMqUtils;
import com.errorfinding.rabbitmq.util.SleepUtils;
import com.rabbitmq.client.CancelCallback;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.DeliverCallback;

import java.io.IOException;
import java.util.concurrent.TimeoutException;

/**
 * 工作队列（消费者）
 *
 * 消息在手动应答时是不丢失,放回队列中重新消费
 */
public class Work03 {

    //队列名称
    public static final String TASK_QUEUE_NAME = "ack_queue";

    public static void main(String[] args) throws IOException, TimeoutException {

        //获取信道
        Channel channel = RabbitMqUtils.getChannel();

        System.out.println("C1_等待接收消息处理时间较短");
        //消息接收成功回调
        DeliverCallback deliverCallback = (consumerTag,message)->{
            //沉睡1秒钟
            SleepUtils.sleep(1);
            System.out.println("接收到的消息："+new String(message.getBody(),"utf-8"));
            //手动应答
            /**
             * 1.消息的标记 唯一标识 tag
             * 2.是否批量应答 true/false 建议使用false 不批量应答信道中的消息  true 批量
             */
            channel.basicAck(message.getEnvelope().getDeliveryTag(),false);

        };
        //消息接收失败回调
        CancelCallback cancelCallback = (consumerTag)->{
            System.out.println(consumerTag+" 取消消费接口回调函数");
        };
        //不公平分发
        //不公平分发 channel.basicQos(1)
        //参数只有 等于 1 时才触发 不公平分发
        //预取值
        //取决于 当前消费者信道里有几条消息
        //参数大于 1 时 就是 预取值 指定消费者消费多少条消息 当 消息数量大于预取值时 则进行不公平分发
        int prefetchCount = 1;
        channel.basicQos(prefetchCount);

        //消费消息
        boolean autoAck = false;
        channel.basicConsume(TASK_QUEUE_NAME,autoAck,deliverCallback,cancelCallback);

    }
}
